/**
题目:
    给定一个二叉搜索树，同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树，使得所有节点的值在[L, R]中 (R>=L) 。
    你可能需要改变树的根节点，所以结果应当返回修剪好的二叉搜索树的新的根节点。
示例 1:
输入: 
    1
   / \
  0   2

  L = 1
  R = 2

输出: 
    1
      \
       2
示例 2:

输入: 
    3
   / \
  0   4
   \
    2
   /
  1

  L = 1
  R = 3

输出: 
      3
     / 
   2   
  /
 1


来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/trim-a-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
思路:
    递归,分类讨论递归基
*/
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func trimBST(root *TreeNode, low int, high int) *TreeNode {
    if root == nil{
        return nil
    }
    if root.Left == nil && root.Right == nil{
        if root.Val >= low && root.Val <= high{
            return root
        }else{
            return nil
        }
    }
    if root.Val < low{
        return trimBST(root.Right,low, high)
    }

    if root.Val > high{
        return trimBST(root.Left,low, high)
    }

    if root.Val >= low && root.Val <= high{
        root.Left = trimBST(root.Left, low, high)
        root.Right = trimBST(root.Right, low, high)
        return root
    }
    return nil
}